package com.tian.view.draw.canvas

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.util.AttributeSet
import android.view.View
import com.tian.util.view.DisplayUtil

/**
 * @author tiansongtao, Email:tiansongtao@up366.com
 * @date 2022/12/13 17:05
 */
class CanvasTranslateView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
        View(context, attrs, defStyleAttr) {
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context) : this(context, null)

    val mPaint: Paint = Paint()

    init {
        mPaint.color = Color.GREEN
        mPaint.strokeWidth = DisplayUtil.dpToPx(2f)
        mPaint.style = Paint.Style.STROKE
    }

    /**
     * canvas都称之为画布，其实叫图层更合适，原因：Android在调用canvas.draw时创建一个透明图层，
     * 之后会在这个透明图层上draw，每次draw之后将该图层放到屏幕上。
     *
     * translate等位置，缩放操作可以理解为在View的整个屏幕上进行的，所以操作是不可逆的，
     * 操作完之后后续的图层创建都是在这个配置下完成的。
     *
     * canvas操作可以对应的是 save 和 restore,
     *  save: 将当前画布的转态配置保存并压入到栈内
     *  restore: 将栈顶的画布状态配置取出，并将画布恢复到该状态
     * 根据上面我们可以经常来操作画布，不用担心操作混乱，在平时的开发中一般我们需要操作
     * 画布时先 save, draw完后就 restore，这样我们在进行下一步操作时，画布始终处于初始状态。
     */
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        mPaint.color = Color.GREEN
        canvas.drawRect(Rect(10, 10, 200, 200), mPaint)
        canvas.save()
        canvas.translate(100f, 100f)
        mPaint.color = Color.RED
        canvas.drawRect(Rect(10, 10, 200, 200), mPaint)
        canvas.restore()
        mPaint.color = Color.BLUE
        canvas.drawRect(Rect(20, 20, 150, 150), mPaint)

    }
}